package orm

import "strings"

type Column struct {
	name  string
	alias string
}

func (c Column) expr() {}

func (c Column) selectable() {}

func (c Column) As(alias string) Column {
	return Column{
		name:  c.name,
		alias: alias,
	}
}

type Value struct {
	val any
}

func (c Value) expr() {}

func ValueOf(val any) Value {
	return Value{
		val: val,
	}
}

func C(name string) Column {
	return Column{name: name}
}

// EQ 例如 C("id").Eq(12)
func (c Column) EQ(arg any) Predicate {
	return Predicate{
		left:  c,
		op:    opEQ,
		right: exprOf(arg),
	}
}

func (c Column) LT(arg any) Predicate {
	return Predicate{
		left:  c,
		op:    opLT,
		right: exprOf(arg),
	}
}

func (c Column) GT(arg any) Predicate {
	return Predicate{
		left:  c,
		op:    opGT,
		right: exprOf(arg),
	}
}

func (c Column) Name() string {
	// 驼峰法转下划线法
	var sb strings.Builder
	for i, r := range c.name {
		if i > 0 && r >= 'A' && r <= 'Z' {
			sb.WriteByte('_')
		}

		if r <= 'Z' && r >= 'A' {
			r += 32
		}

		sb.WriteRune(r)
	}

	return sb.String()
}
